package com.xlf.controller.admin;


import com.xlf.dto.TagTreeDTO;
import com.xlf.service.FoodService;
import com.xlf.service.FoodTagService;
import com.xlf.service.TagService;
import com.xlf.service.TypeService;
import com.xlf.utils.ResponseResult;
import com.xlf.vo.FoodVO;
import com.xlf.vo.IsDisableVO;
import com.xlf.vo.QueryPageBean;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 食品（商品）管理，包含菜品信息、分类信息、标签信息、小料信息的数据管理
 */

@RestController
@RequestMapping("/food")
@Tag(name = "食品（商品）管理", description = "包含菜品信息、分类信息、标签信息、小料信息的数据管理")
public class FoodController {

    @Autowired
    TypeService typeService;

    @Autowired
    TagService tagService;

    @Autowired
    FoodService foodService;

    @Resource
    FoodTagService foodTagService;


//    @GetMapping("/getTypeCount")
//    public ResponseResult<?> getTypeCount() {
//        return ResponseResult.success( "获取分类信息成功", typeService.getTypeCount());
//    }
//
//    @GetMapping("/getTagCount")
//    public ResponseResult getTagCount() {
//        return ResponseResult.success( "获取标签信息成功", tagService.getTagCount());
//    }
//
//    @PostMapping("/getFoodPage")
//    public ResponseResult getFoodPage(@RequestBody QueryPageBean queryPageBean){
//
//        return ResponseResult.success("获取后台food成功",foodService.getFoodPage(queryPageBean));
//    }
//
//    @GetMapping("/getFoodById/{id}")
//    public ResponseResult getFoodById(@PathVariable("id") Long id){
//        return ResponseResult.success("通过food_id获取food成功",foodService.getFoodById(id));
//    }
//
//    @CacheEvict(value = "clientCacheMenuList",allEntries = true)
//    @DeleteMapping("/delete")
//    public ResponseResult deleteFoodByIds(@RequestBody List<Long> ids) {
//        foodService.removeByIds(ids);
//        return ResponseResult.success("删除食物成功");
//    }
//
//    @CacheEvict(value = "clientCacheMenuList",allEntries = true)
//    @PostMapping("/saveOrUpdateFood")
//    public ResponseResult saveOrUpdateFood(@RequestBody FoodVO foodVO){
//
//        foodService.saveOrUpdateFood(foodVO);
//        return ResponseResult.success("新增/修改食物成功");
//    }
//
//    /**
//     * 获取小料列表
//     * @return
//     */
//    @GetMapping("/getFoodMinList")
//    public ResponseResult getFoodMinById(){
//        return ResponseResult.success("获取小料列表成功",foodService.getFoodMinList());
//    }
//
//    /**
//     * 获取食物的标签树
//     * @return
//     */
//    @GetMapping("/getTagMenuTree/{id}")
//    public ResponseResult getTagMenuTree(@PathVariable(value = "id") Long id){
//        return ResponseResult.success("获取标签树成功",tagService.getTagMenuTreeByFoodId(id));
//    }
//
//    /**
//     * 获取食物选择的标签id集合
//     * @param id
//     * @return
//     */
//    @Deprecated
//    @GetMapping("/geFoodSelectTagIdList/{id}")
//    public ResponseResult geFoodSelectTagIdListByFoodId(@PathVariable(value = "id") Long id){
//        return ResponseResult.success("获取食物选择的标签成功",tagService.geFoodSelectTagIdListByFoodId(id));
//    }
//
//    /**
//     * 获取标签描述
//     * @param foodId
//     * @param tagId
//     * @return
//     */
//    @Deprecated
//    @GetMapping("/getTagDescByFoodIdAndTagId/{foodId}/{tagId}")
//    public ResponseResult getTagDescByFoodIdAndTagId(
//            @PathVariable(value = "foodId") Long foodId,
//            @PathVariable(value = "tagId") Long tagId){
//        return ResponseResult.success("获取标签描述成功",tagService.getTagDescByFoodIdAndTagId(foodId,tagId));
//    }
//
//    /**
//     * 更新食物的标签树
//     * @param tagTreeDTO
//     * @return
//     */
//    @CacheEvict(value = "clientCacheMenuList",allEntries = true)
//    @PostMapping("/savaTagTree")
//    public ResponseResult savaTagTree(@RequestBody TagTreeDTO tagTreeDTO){
//        foodTagService.savaTagTreeByFoodId(tagTreeDTO);
//        return ResponseResult.success("更新成功");
//    }
//
//    /**
//     * 禁用食物
//     * @param isDisableVO
//     * @return
//     */
//    @CacheEvict(value = "clientCacheMenuList",allEntries = true)
//    @PostMapping("/foodDisable")
//    public ResponseResult foodDisable(@RequestBody IsDisableVO isDisableVO){
//        foodService.update().eq("id",isDisableVO.getId()).set("status",isDisableVO.getIsDisable()?1:0).update();
//        return ResponseResult.success("修改成功");
//    }

    /**
     * 获取分类统计信息
     * 用于后台管理界面展示食品分类的数量统计
     *
     * @return ResponseResult 包含分类统计信息的响应结果
     */
    @Operation(summary = "获取分类统计信息", description = "用于后台管理界面展示食品分类的数量统计")
    @GetMapping("/getTypeCount")
    public ResponseResult<?> getTypeCount() {
        return ResponseResult.success("获取分类信息成功", typeService.getTypeCount());
    }

    /**
     * 获取标签统计信息
     * 用于后台管理界面展示食品标签的数量统计
     *
     * @return ResponseResult 包含标签统计信息的响应结果
     */
    @Operation(summary = "获取标签统计信息", description = "用于后台管理界面展示食品标签的数量统计")
    @GetMapping("/getTagCount")
    public ResponseResult getTagCount() {
        return ResponseResult.success("获取标签信息成功", tagService.getTagCount());
    }

    /**
     * 条件查询食品信息，支持分页、时间区间、分类/标签id查询。
     * 根据查询条件获取食品的分页列表数据
     *
     * @param queryPageBean 分页查询参数，包含页码、页大小、查询条件等
     * @return ResponseResult 包含分页食品数据的响应结果
     */
    @Operation(summary = "条件查询食品信息", description = "支持分页、时间区间、分类/标签id查询")
    @Parameter(description = "分页查询参数，包含页码、页大小、查询条件等")
    @PostMapping("/getFoodPage")
    public ResponseResult getFoodPage(@RequestBody QueryPageBean queryPageBean) {
        return ResponseResult.success("获取后台food成功", foodService.getFoodPage(queryPageBean));
    }

    /**
     * 根据ID获取食品详细信息
     * 通过食品ID查询单个食品的完整信息
     *
     * @param id 食品ID
     * @return ResponseResult 包含食品详细信息的响应结果
     */
    @Operation(summary = "根据ID获取食品详细信息", description = "通过食品ID查询单个食品的完整信息")
    @Parameter(description = "食品ID")
    @GetMapping("/getFoodById/{id}")
    public ResponseResult getFoodById(@PathVariable("id") Long id) {
        return ResponseResult.success("通过food_id获取food成功", foodService.getFoodById(id));
    }

    /**
     * 批量删除食品
     * 根据食品ID列表批量删除食品记录，同时清空客户端菜单缓存
     *
     * @param ids 要删除的食品ID列表
     * @return ResponseResult 删除操作结果的响应
     */
    @CacheEvict(value = "clientCacheMenuList", allEntries = true)
    @Operation(summary = "批量删除食品", description = "根据食品ID列表批量删除食品记录，同时清空客户端菜单缓存")
    @Parameter(description = "要删除的食品ID列表")
    @DeleteMapping("/delete")
    public ResponseResult deleteFoodByIds(@RequestBody List<Long> ids) {
        foodService.removeByIds(ids);
        return ResponseResult.success("删除食物成功");
    }

    /**
     * 新增或更新食品信息
     * 根据传入的食品信息对象进行新增或修改操作，同时清空客户端菜单缓存
     *
     * @param foodVO 食品信息值对象，包含食品的详细信息
     * @return ResponseResult 操作结果的响应
     */
    @Operation(summary = "新增或更新食品信息", description = "根据传入的食品信息对象进行新增或修改操作，同时清空客户端菜单缓存")
    @CacheEvict(value = "clientCacheMenuList", allEntries = true)
    @PostMapping("/saveOrUpdateFood")
    public ResponseResult saveOrUpdateFood(@RequestBody FoodVO foodVO) {
        foodService.saveOrUpdateFood(foodVO);
        return ResponseResult.success("新增/修改食物成功");
    }

    /**
     * 获取小料列表
     * 查询所有可用的小料信息，用于食品管理中的小料选择
     *
     * @return ResponseResult 包含小料列表的响应结果
     */
    @Operation(summary = "获取小料列表", description = "查询所有可用的小料信息，用于食品管理中的小料选择")
    @GetMapping("/getFoodMinList")
    public ResponseResult getFoodMinById() {
        return ResponseResult.success("获取小料列表成功", foodService.getFoodMinList());
    }

    /**
     * 获取食品的标签菜单树
     * 根据食品ID获取该食品对应的标签树形结构数据
     *
     * @param id 食品ID
     * @return ResponseResult 包含标签菜单树的响应结果
     */
    @Operation(summary = "获取食品的标签菜单树", description = "根据食品ID获取该食品对应的标签树形结构数据")
    @GetMapping("/getTagMenuTree/{id}")
    public ResponseResult getTagMenuTree(@PathVariable(value = "id") Long id) {
        return ResponseResult.success("获取标签树成功", tagService.getTagMenuTreeByFoodId(id));
    }

    /**
     * 获取食品已选标签ID列表
     * 根据食品ID获取该食品已经选择的标签ID集合
     *
     * @param id 食品ID
     * @return ResponseResult 包含已选标签ID列表的响应结果
     * @deprecated 此方法已过时，建议使用其他替代方案
     */
    @Operation(summary = "获取食品已选标签ID列表", description = "根据食品ID获取该食品已经选择的标签ID集合")
    @Parameter(description = "食品ID")
    @Deprecated
    @GetMapping("/geFoodSelectTagIdList/{id}")
    public ResponseResult geFoodSelectTagIdListByFoodId(@PathVariable(value = "id") Long id) {
        return ResponseResult.success("获取食物选择的标签成功", tagService.geFoodSelectTagIdListByFoodId(id));
    }

    /**
     * 根据食品ID和标签ID获取标签描述
     * 查询特定食品和标签组合的描述信息
     *
     * @param foodId 食品ID
     * @param tagId 标签ID
     * @return ResponseResult 包含标签描述的响应结果
     * @deprecated 此方法已过时，建议使用其他替代方案
     */
    @Operation(summary = "根据食品ID和标签ID获取标签描述", description = "查询特定食品和标签组合的描述信息")
    @Deprecated
    @GetMapping("/getTagDescByFoodIdAndTagId/{foodId}/{tagId}")
    public ResponseResult getTagDescByFoodIdAndTagId(
            @PathVariable(value = "foodId") Long foodId,
            @PathVariable(value = "tagId") Long tagId) {
        return ResponseResult.success("获取标签描述成功", tagService.getTagDescByFoodIdAndTagId(foodId, tagId));
    }

    /**
     * 保存食品的标签树配置
     * 更新食品与标签的关联关系，同时清空客户端菜单缓存
     *
     * @param tagTreeDTO 标签树数据传输对象，包含食品ID和标签配置信息
     * @return ResponseResult 操作结果的响应
     */
    @Operation(summary = "保存食品的标签树配置", description = "更新食品与标签的关联关系，同时清空客户端菜单缓存")
    @CacheEvict(value = "clientCacheMenuList", allEntries = true)
    @PostMapping("/savaTagTree")
    public ResponseResult savaTagTree(@RequestBody TagTreeDTO tagTreeDTO) {
        foodTagService.savaTagTreeByFoodId(tagTreeDTO);
        return ResponseResult.success("更新成功");
    }

    /**
     * 启用/禁用食品
     * 根据传入的状态值更新食品的启用禁用状态，同时清空客户端菜单缓存
     *
     * @param isDisableVO 状态值对象，包含食品ID和禁用状态
     * @return ResponseResult 操作结果的响应
     */
    @Operation(summary = "启用/禁用食品", description = "根据传入的状态值更新食品的启用禁用状态，同时清空客户端菜单缓存")
    @CacheEvict(value = "clientCacheMenuList", allEntries = true)
    @PostMapping("/foodDisable")
    public ResponseResult foodDisable(@RequestBody IsDisableVO isDisableVO) {
        foodService.update().eq("id", isDisableVO.getId()).set("status", isDisableVO.getIsDisable() ? 1 : 0).update();
        return ResponseResult.success("修改成功");
    }
}
